/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.uch.biblioteca.hibernateSpringDao;

import java.util.ArrayList;
import java.util.List;
import net.uch.biblioteca.mapping.BibCatalogoDetalle;
import net.uch.biblioteca.mapping.BibEjemplar;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.hibernate.Criteria;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

public class HSBibCatalogoDetalleDAOImpl extends HibernateDaoSupport implements HSBibCatalogoDetalleDAO {

    @Override
    public void guardarCatalogoDetalle ( BibCatalogoDetalle catDet ) throws Exception {
        this.getHibernateTemplate().save( catDet );
    }

    @Override
    public void eliminarCatalogoDetalle ( String sTipoCat ) throws Exception {
        String sHqlUpdate;

        sHqlUpdate = "delete BibCatalogoDetalle where catCol = :catCol";
        this.getSession().createQuery( sHqlUpdate ).setString( "catCol", sTipoCat ).
                executeUpdate();
    }

    @Override
    public List<BibCatalogoDetalle> traerDocumentos ( String Coleccion, String Descripcion, String tipo ) {
        Criteria criteria;
        List lstIds;
        List<BibCatalogoDetalle> lstAux;
        criteria = this.getSession().
                createCriteria( BibCatalogoDetalle.class ).
                add( Restrictions.eq( "catCol", Coleccion ) );


        if ( "005001".equals( tipo ) ) { // TITULO 245, 730, 856, 853
            criteria.add( Restrictions.disjunction().add( Restrictions.eq( "marCodi", "245" ) ).add( Restrictions.eq( "marCodi", "730" ) ).add( Restrictions.eq( "marCodi", "856" ) ).add( Restrictions.eq( "marCodi", "853" ) ) ).add( Restrictions.like( "marCont", "%" + Descripcion + "%" ) );
        }
        if ( "005002".equals( tipo ) ) {
            criteria.add( Restrictions.disjunction().add( Restrictions.eq( "marCodi", "100" ) )// AUTOR: 100, 700, 710, 711
                    .add( Restrictions.eq( "marCodi", "700" ) ).add( Restrictions.eq( "marCodi", "710" ) ).add( Restrictions.eq( "marCodi", "711" ) ) ).add( Restrictions.like( "marCont", "%" + Descripcion + "%" ) );
        }
        if ( "005003".equals( tipo ) ) {
            criteria.add( Restrictions.disjunction().add( Restrictions.eq( "marCodi", "600" ) )// TEMA: 600, 610, 611, 650, 651
                    .add( Restrictions.eq( "marCodi", "610" ) ).add( Restrictions.eq( "marCodi", "611" ) ).add( Restrictions.eq( "marCodi", "650" ) ).add( Restrictions.eq( "marCodi", "651" ) ) ).add( Restrictions.like( "marCont", "%" + Descripcion + "%" ) );
        }
        if ( "005004".equals( tipo ) ) {
            ProjectionList pl = Projections.projectionList();
            pl.add( Projections.property( "catId" ) );
            pl.add( Projections.groupProperty( "catId" ) );

            criteria.add( Restrictions.like( "marCont", "%" + Descripcion + "%" ) ).setProjection( pl );
            lstIds = criteria.list();
            BibCatalogoDetalle bcd;
            Object[] aObj;
            lstAux = new ArrayList<BibCatalogoDetalle>();
            for ( Object object : lstIds ) {
                aObj = (Object[]) object;
                bcd = new BibCatalogoDetalle();
                bcd.setCatId( Integer.parseInt( String.valueOf( aObj[0] ) ) );
                lstAux.add( bcd );
            }
            return lstAux;
        }
        return criteria.list();
    }

    public List<BibCatalogoDetalle> SeleccionarDoc ( int catId ) {
        List<BibCatalogoDetalle> det;

        det = this.getSession().
                createCriteria( BibCatalogoDetalle.class ).
                add( Restrictions.eq( "catId", catId ) ).list();

        return det;
    }

    public List<BibEjemplar> EjemplaresxDocumento ( int catId ) {
        List<BibEjemplar> eje;
        Integer idEjemplar;

        String sHqlQuery;

        sHqlQuery = "SELECT ej.eje_id FROM bib_catalogo_detalle bcd "
                + "INNER JOIN bib_ejemplar ej ON(ej.cat_eje=bcd.cat_eje) "
                + "WHERE bcd.cat_id=:catId and bcd.cat_eje!='null' "
                + "AND ej.eje_est='0' LIMIT 1";

        idEjemplar = (Integer)this.getSession().
                createSQLQuery( sHqlQuery ).
                setInteger( "catId", catId ).uniqueResult();
        eje = new ArrayList<BibEjemplar>();
        
        if(idEjemplar != null){
            eje.add( new BibEjemplar( idEjemplar ) );
        }

        return eje;
    }
    
    public BibCatalogoDetalle traerCatDocumento(String codigo){
        BibCatalogoDetalle det;
                
                return (BibCatalogoDetalle)this.getSession().
                createCriteria( BibCatalogoDetalle.class ).
                add( Restrictions.eq( "catEje", codigo ) ).uniqueResult();
    }
    
    public List<BibCatalogoDetalle> traerTituloDoc (int catId){
        List<BibCatalogoDetalle> det;
        
        det = this.getSession().
                createCriteria( BibCatalogoDetalle.class ).
                add( Restrictions.eq( "catId", catId ) )
                .add( Restrictions.disjunction().add( Restrictions.eq( "marCodi", "245" ) )
                .add( Restrictions.eq( "marCodi", "730" ) )
                .add( Restrictions.eq( "marCodi", "856" ) )
                .add( Restrictions.eq( "marCodi", "853" ) ) )
                .list();
        
        return det;
    }

}
